package day02;

import java.util.Arrays;
import java.util.Scanner;

/*
@Author: 王少杰
@Date: 2024/12/31
@Time: 14:17
@FileName: Demo04.class
@描述:
数组:Array
    多个相同类型的数据按照一定的顺序组成的集合。
    固定长度
    有序的，下标/索引访问里面的元素，0,1,2
    数组中可以存放基本类型的数据，引用类型的数据。
    数组在内存中用一段连续空间存储
    一维数组、二维数组、多为数组，一维和二维使用比较多。

*/
public class Demo04 {
    public static void main(String[] args) {
        //声明一个数组，并初始化,数组长度为5
        int[] scores = new int[]{90,100,99,80,60};
        System.out.println(scores[0]);
        System.out.println(scores[4]);
        //System.out.println(scores[5]);异常，数组越界

        //声明了一个数组，长度为10
        //String 类，创建的数组，元素默认为null 空值
        String[] names = new String[10];
        names[0] = "Tom";
        names[1] = "Jack";
        names[2] = "Bob";
        names[3] = "Jack";
        System.out.println(scores.length);
        System.out.println(names.length);
        System.out.println(names);//内存地址
        System.out.println(scores);
        //Arrays 类，定义了一些方法操作数组
        System.out.println(Arrays.toString(scores));
        System.out.println(Arrays.toString(names));

        /*
        数组常用的一些操作
        1.数组中的最值
        3.查找数值中是否有某个元素
         */
        int[] score = new int[]{90,100,99,80,60,66,58,98,88,86};
        int min = score[0];//将数组中第一个元素给到最小值
        int max = score[0];
        //遍历数组中的元素；根据下标遍历
        for (int i = 0; i < score.length; i++) {//遍历数组中所有元素
            if (score[i] < min) {//如果比最小值小
                min = score[i];//替换最小值
            }
            if (score[i] > max) {
                max = score[i];
            }
        }
        min = score[0];
        for (int num : score) {//遍历数组中所有元素
            if (num < min) {//如果比最小值小
                min = num;//替换最小值
            }
        }
        System.out.println("最小值为:" +  min + "最大值为:" + max);
        System.out.println(Arrays.stream(score).min().getAsInt());

        //2.数组中的元素排序---冒泡排序，比较相元素，顺序与要求的不一样，交换位置，直到没有可交换的为止。
        int[] scores1 = new int[]{90,100,99,80,60};
        //从小到达排序
        //外层循环，控制趟数
        for (int i = 0; i < scores1.length; i++) {
            //内层循环，控制本次循环次数
            for (int j = 0; j < scores1.length-i-1; j++) {
                if (scores1[j] > scores1[j+1]) {
                    int temp = scores1[j];
                    scores1[j] = scores1[j+1];
                    scores1[j+1] = temp;
                }
            }
        }
        System.out.println("排序后的:" + Arrays.toString(scores1));

        //数组工具类中提供的排序方法
        Arrays.sort(scores1);
        //3.查找数组中是否有某个元素
        //插入点，元素在数组中存在的话，应该放的位置。
        System.out.println(Arrays.binarySearch(scores1, 90));//二分查找,找不到的时候，返回-(插入点+1)
        System.out.println(Arrays.binarySearch(scores1, 100));//找到返回，元素下标
    }
}

class Student{
    public static void main(String[] args) {
        //从键盘输入n个学生,有若干个成绩，将成绩放数组中，计算平均分
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入n:");
        int n = sc.nextInt();
        double sum = 0;
        double[] scores = new double[n];
        for (int i = 0; i < n; i++) {
            double v = sc.nextDouble();
            scores[i] = v;
            sum += v;
        }
        System.out.println("学生成绩为:" + Arrays.toString(scores) + ",平均成绩为:" + sum/n);
    }
}

/*
二维数组:
    3个班级，每个班5个学生，存放学生的年龄

 */
class array{
    public static void main(String[] args) {
        int[][] ages = new int[3][5]; //3行5列
        //第一个班
        ages[0][0] = 10;
        ages[0][1] = 9;
        ages[0][2] = 8;
        ages[0][3] = 12;
        ages[0][4] = 7;
        //第二个班
        //new int[]{6,7,6,9,10};  没有写数组的长度，根据{}值的个数推断了数组的长度
        ages[1] = new int[]{6,7,6,9,10};//二维数组，相当于一维数组，数组的元素仍是一维数组
        //第三个班
        ages[2] = new int[]{16,18,15,17,18};
        System.out.println(ages.length);//第一维长度
        System.out.println(ages[1].length);//第二维长度

        //遍历 下标
        for (int i = 0; i < ages.length; i++) {//二维数组
            System.out.println("第" + (i + 1) + "班级的学生年龄为:");
            for (int j = 0; j < ages[i].length; j++) {//一维数组
                System.out.print(ages[i][j] + "\t");
            }
            System.out.println();
        }

        //遍历 元素
        int i = 0;
        for (int[] age : ages) {//二维数组中取出的是一维数组
            System.out.println("第" + (i + 1) + "班级的学生年龄为:");
            for (int a:age){
                System.out.print(a + "\t");
            }
            System.out.println();
            i++;
        }
    }
}
class juzhen{
    public static void main(String[] args) {
         /*
        矩阵:n行m列，矩阵中元素的值通过键盘输入
        将矩阵打印下来，所有元素和打印下来
        1 2 3
        4 5 6
        7 8 9
        10 11 12
        */
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入n行m列:");
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[][] matrix = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.out.print("请输入第" + (i + 1) + "行，第" + (j + 1) + "列的元素: ");
                matrix[i][j] = sc.nextInt();//使用键盘输入的值初始化数组中的值
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.out.print(matrix[i][j] + "\t");
            }
            System.out.println();
        }

        int sum = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                sum += matrix[i][j];
            }
        }
        System.out.println("和为:" + sum);
    }
}